/*
利用硬件I2C驱动OLED，点亮、熄灭OLED屏幕以及获取当前OLED屏幕开启状态
*/

#include "stm32f10x.h"
#include "hOLED.h"
#include "USART.h"
#include "Delay.h"
#include <stdio.h>

void hOLED_HandleOn(void);		// 开启屏幕并发送开启成功与否给PC端
void hOLED_HandleOff(void);		// 关闭屏幕并发送关闭成功与否给PC端
void hOLED_HandleStatus(void);	// 读取屏幕开启状态并把这个状态发送给PC端
void USART1_IRQHandler(void);	// USART外设全局中断处理函数, 在这里我们处理RXNE标志位中断

int main(void) {
	USART1_Config();	// 初始化 USART
	hOLED_Init(); 		// 初始化 OLED

	// hOLED_On();  	// 测试 hOLED 能否连接
	
	while (1) {
	// 所有处理逻辑都交给中断触发处理
	}
}

// USART外设全局中断处理函数, 在这里我们处理RXNE标志位中断
void USART1_IRQHandler(void) {
	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { 
		uint8_t recv = USART_ReceiveData(USART1); 		// 读取接收数据
		
		// 根据命令执行相应操作
		switch (recv) {
		 case '0':  // 关闭OLED
			 hOLED_HandleOff();
			 break;
		 case '1':  // 打开OLED
			 hOLED_HandleOn();
			 break;
		 case '2':  // 查询OLED状态
			 hOLED_HandleStatus();
			 break;
		 default:
			 USART1_SendString("Command Error: Invalid command\r\n");
			 break;
		}
	}
}

// 打开OLED的处理函数
void hOLED_HandleOn(void) {
	if (hOLED_On() == 0) {
	 USART1_SendString("OLED-TurnOn: Success\r\n");
	} else {
	 USART1_SendString("OLED-TurnOff: Failed\r\n");
	}
}

// 关闭OLED的处理函数
void hOLED_HandleOff(void) {
	if (hOLED_Off() == 0) {
	 USART1_SendString("OLED-TurnOFF: Success\r\n");
	} else {
	 USART1_SendString("OLED-TurnOFF: Failed\r\n");
	}
}

// 查询OLED状态的处理函数
void hOLED_HandleStatus(void) {
	uint8_t OLED_Status;
	if (hOLED_ReadStatus(&OLED_Status) == 0) {
		if (OLED_Status == 0) {
			USART1_SendString("OLED-Status: ON\r\n");
		} 
		else {
			USART1_SendString("OLED-Status: OFF\r\n");
		}
	} 
	else {
		USART1_SendString("OLED-Status: Failed to read\r\n");
	}
}
